package com.wpp;
/*
 * 动态代理：
 *   接口要有，被代理类要有，只是代理类改成动态的了
 *
 * */

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//1.造一个接口
interface acthor {
    void music();
}

//2.创建被代理类
class musics implements acthor {

    @Override
    public void music() {
        System.out.println("负责唱歌");
    }

}

//动态创建一个代理类
class myproxy implements InvocationHandler {

    private Object obj;//创建被代理类对象

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public Object getProxy() {

        Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
        return o;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = method.invoke(obj);
        return invoke;
    }


}


public class ProxyTest {

    public static void main(String args[]) {

        musics musics = new musics();//被代理类的对象

        myproxy myproxy = new myproxy();//动态代理类

        myproxy.setObj(musics);//把被代理类对象放进去

        acthor proxy = (acthor) myproxy.getProxy();//多态
        proxy.music();//调用方法

    }
}
